2023.12.29 クロージャ
(参考) Python Tips: Python でクロージャを使いたい
クロージャとは「参照環境を伴った関数あるいはその関数への参照」のこと。
参照環境:ローカル環境にはない変数への参照を保持したテーブルのこと。
まず、関数を一般的な使い方で呼び出した場合。
code:closure1.py
def func(name):
print('a:', animal, 'x:', name)
animal = 'イヌ'
func('ポチ') # (1)
animal = 'ネコ'
func('タマ') # (2)
関数func内の変数animalの値は、呼出した時点(1), (2)におけるグローバル変数animalの値が参照される。
2023.12.29 関数内関数を参照したうえで、次のプログラムを参照して下さい。
code:closure2.py
def outer(animal):
def inner(name):
print('a:', animal, 'x:', name)
return inner
func1 = outer('イヌ') # (1)
func2 = outer('ネコ') # (2)
func1('ポチ')
func2('タマ')
outer関数の呼出し(1), (2)により2つの関数内関数innerが作られ、関数への参照func1, func2が作られる。
func1, func2は関数への参照に加え、これらを呼出した時点における関数outerが有していたスコープへの参照も伴っている。
参照func1, func2を介して呼び出した関数innerには、スコープも同時に渡されており、それを用いて変数animalを解決している。